home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / disk-man / mtools-3.000 / mtools-3 / mtools-3.0 / mdel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-08  |  2.8 KB  |  137 lines

  1. /*
  2.  * mdel.c
  3.  * Delete an MSDOS file
  4.  *
  5.  */
  6.  
  7. #include "sysincludes.h"
  8. #include "msdos.h"
  9. #include "mtools.h"
  10. #include "stream.h"
  11. #include "streamcache.h"
  12. #include "fs.h"
  13. #include "file.h"
  14.  
  15. typedef struct Arg_t {
  16.     int deltype;
  17.     int verbose;
  18.     char *progname;
  19. } Arg_t;
  20.  
  21. static int del_entry(Stream_t *Dir, StreamCache_t *sc, int entry)
  22. {
  23.     Arg_t *arg=(Arg_t *) sc->arg;
  24.     unsigned int start;
  25.  
  26.     if (arg->verbose)
  27.         fprintf(stderr,"Removing %s\n", sc->outname);
  28.     if(got_signal)
  29.         return MISSED_ONE;
  30.  
  31.     if ((sc->dir.attr & 0x05) &&
  32.         (ask_confirmation("%s: \"%s\" is read only, erase anyway (y/n) ? ",
  33.                   arg->progname, sc->outname)))
  34.         return MISSED_ONE;
  35.     start = sc->dir.start[1] * 0x100 + sc->dir.start[0];
  36.     if (fat_free(sc->Fs,start))
  37.         return MISSED_ONE;
  38.     sc->dir.name[0] = (char) 0xe5;
  39.     dir_write(Dir,entry,& sc->dir);
  40.     return GOT_ONE;
  41. }
  42.  
  43. static int del_file(Stream_t *Dir, StreamCache_t *sc, int entry)
  44. {
  45.     char shortname[13];
  46.     int sub_entry = 0;
  47.     Stream_t *SubDir;
  48.     Arg_t *arg = (Arg_t *) sc->arg;
  49.     StreamCache_t sonsc;
  50.     char outname[VBUFSIZE];
  51.     int ret;
  52.  
  53.     sonsc = *sc;
  54.     sonsc.outname = outname;
  55.     sonsc.arg = sc->arg;
  56.  
  57.     if (sc->dir.attr & 0x10){
  58.         /* a directory */
  59.  
  60.         SubDir = open_file( COPY(sc->Fs), & sc->dir);
  61.  
  62.         ret = 0;
  63.         while(!vfat_lookup(SubDir, sc->Fs, &sonsc.dir, &sub_entry, 
  64.                    0, "*",
  65.                    ACCEPT_DIR | ACCEPT_PLAIN,
  66.                    outname, shortname, NULL, NULL) ){
  67.             if((unsigned char)shortname[0] != 0xe5 &&
  68.                shortname[0] &&
  69.                shortname[0] != '.' ){
  70.                 if(arg->deltype != 2){
  71.                     fprintf(stderr,
  72.                         "Directory %s non empty\n", 
  73.                         sc->outname);
  74.                     ret = MISSED_ONE;
  75.                     break;
  76.                 }
  77.                 if(got_signal) {
  78.                     ret = MISSED_ONE;
  79.                     break;
  80.                 }
  81.                 ret = del_file(SubDir, &sonsc, sub_entry - 1);
  82.                 if( ret & MISSED_ONE)
  83.                     break;
  84.                 ret = 0;
  85.             }
  86.         }
  87.         FREE(&SubDir);
  88.         if(ret)
  89.             return ret;
  90.     }
  91.     return del_entry(Dir, sc, entry);
  92. }
  93.  
  94. void mdel(int argc, char **argv, int deltype)
  95. {
  96.     int fargn;
  97.     Arg_t arg;
  98.     StreamCache_t sc;
  99.     int ret;
  100.     char filename[VBUFSIZE];
  101.  
  102.     if (argc > 1 && !strcmp(argv[1], "-v")) {
  103.         arg.verbose = 1;
  104.         fargn = 2;
  105.     } else {
  106.         arg.verbose = 0;
  107.         fargn = 1;
  108.     }
  109.     if (argc < 2 || (argv[1][0] == '-' && !arg.verbose)) {
  110.         fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
  111.         fprintf(stderr, "Usage: %s [-vV] msdosfile [msdosfiles...]\n", argv[0]);
  112.         cleanup_and_exit(1);
  113.     }
  114.  
  115.     init_sc(&sc);
  116.     sc.callback = del_file;
  117.     sc.outname = filename;
  118.     sc.arg = (void *) &arg;
  119.     sc.openflags = O_RDWR;
  120.     arg.deltype = deltype;
  121.     switch(deltype){
  122.     case 0:
  123.         sc.lookupflags = ACCEPT_PLAIN; /* mdel */
  124.         break;
  125.     case 1:
  126.         sc.lookupflags = ACCEPT_DIR; /* mrd */
  127.         break;
  128.     case 2:
  129.         sc.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN; /* mdeltree */
  130.         break;
  131.     }
  132.     arg.progname = argv[0];
  133.     ret=main_loop(&sc, argv[0], argv + fargn, argc - fargn);
  134.     finish_sc(&sc);
  135.     cleanup_and_exit(ret);
  136. }
  137.